/*!
 * \file WtExeFact.cpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 *
 * \brief 执行工厂类实现
 * \details 实现执行工厂的创建、删除和管理功能，支持TWAP和最小冲击执行单元
 */
#include "WtExeFact.h"

#include "WtTWapExeUnit.h"
#include "WtMinImpactExeUnit.h"

/// 工厂名称常量
const char* FACT_NAME = "WtExeFact";

/**
 * @brief C接口导出函数
 * @details 提供C风格的接口用于动态库加载
 */
extern "C"
{
	/**
	 * @brief 创建执行工厂实例
	 * @return 返回执行工厂接口指针
	 */
	EXPORT_FLAG IExecuterFact* createExecFact()
	{
		IExecuterFact* fact = new WtExeFact();
		return fact;
	}

	/**
	 * @brief 删除执行工厂实例
	 * @param fact 要删除的执行工厂指针
	 */
	EXPORT_FLAG void deleteExecFact(IExecuterFact* fact)
	{
		if (fact != NULL)
			delete fact;
	}
};


/**
 * @brief 构造函数
 */
WtExeFact::WtExeFact()
{
}


/**
 * @brief 析构函数
 */
WtExeFact::~WtExeFact()
{
}

/**
 * @brief 获取工厂名称
 * @return 返回工厂名称字符串
 */
const char* WtExeFact::getName()
{
	return FACT_NAME;
}

/**
 * @brief 枚举所有可用的执行单元
 * @param cb 枚举回调函数
 * @details 通过回调函数返回所有支持的执行单元类型：
 *          - WtTWapExeUnit: TWAP执行单元
 *          - WtMinImpactExeUnit: 最小冲击执行单元（默认）
 */
void WtExeFact::enumExeUnit(FuncEnumUnitCallback cb)
{
	cb(FACT_NAME, "WtTWapExeUnit", false);
	cb(FACT_NAME, "WtMinImpactExeUnit", true);
}

/**
 * @brief 创建指定类型的执行单元
 * @param name 执行单元名称
 * @return 返回创建的执行单元指针，失败返回NULL
 * @details 支持创建以下类型的执行单元：
 *          - WtTWapExeUnit: 时间加权平均价格执行单元
 *          - WtMinImpactExeUnit: 最小市场冲击执行单元
 */
ExecuteUnit* WtExeFact::createExeUnit(const char* name)
{
	if (strcmp(name, "WtTWapExeUnit") == 0)
		return new WtTWapExeUnit();
	else if (strcmp(name, "WtMinImpactExeUnit") == 0)
		return new WtMinImpactExeUnit();

	return NULL;
}

/**
 * @brief 删除执行单元
 * @param unit 要删除的执行单元指针
 * @return 删除成功返回true，失败返回false
 * @details 验证执行单元是否属于当前工厂，然后安全删除
 */
bool WtExeFact::deleteExeUnit(ExecuteUnit* unit)
{
	if (unit == NULL)
		return true;

	if (strcmp(unit->getFactName(), FACT_NAME) != 0)
		return false;

	delete unit;
	return true;
}
